Práctica desarrollada por Andres J. Sanchez-Fernandez (sfandres@unex.es) y Juan M. Haut (juanmariohaut@unex.es) para la asignatura Sistemas Multimedia de la Universidad de Extremadura.
Fecha de última modificación: 08/03/2023.
| Turno | Tiempo (') | Tarea |
|---|---|---|
| Alumnos | 15 | Acceder al GitHub de la práctica y seguir los pasos para replicar mi repositorio en local y echarlo a andar (hay que seguir el apartado Getting started). |
| Profesor | 45 | Explicar el contenido de este notebook. |
| Alumnos | ∞ | Realizar el ejercicio de clase que se divide en dos partes: creación de un entorno de conda y procesamiento de audio en Python3. |
Los objetivos de esta práctica son los siguientes:
Nota: Estas no son las únicas librerías de Python con las que se pueden trabajar para el procesamiento de archivos de audio (otro ejemplo podría ser Librosa). Si alguien está familiarizado con otras librerías puede utilizarlas.
Importamos las librerías/módulos específicos de la siguiente forma.
# Importacion.
# import librosa
from scipy.io import wavfile
import IPython
import os
import numpy as np
import matplotlib.pyplot as plt
Aquí definimos los directorios donde guardaremos los audios con los que vamos a trabajar, así como dónde se van a guardar aquellos que generamos a lo largo de la práctica.
# Directorios que usaremos.
cwd = os.getcwd()
audio_input_path = os.path.join(cwd, os.path.join('audio', '_input')) # audio_examples
audio_output_path = os.path.join(cwd, os.path.join('audio', '_output'))
print(f'Directorio con los audios de entrada: {audio_input_path}')
print(f'Directorio donde guardaremos los audios generados: {audio_output_path}\n')
Directorio con los audios de entrada: /home/sfandres/Documents/Git/uex-audiopy/audio/_input Directorio donde guardaremos los audios generados: /home/sfandres/Documents/Git/uex-audiopy/audio/_output
Información consultada para el desarrollo de esta práctica:
# # Input data.
# audio_examples_input_path = os.path.join(cwd, os.path.join('audio', 'examples'))
# filename = os.path.join(audio_examples_input_path, 'interstellar.wav')
# sample_rate_v0, audio_data_v0 = wavfile.read(filename)
# print(f'Shape of the input audio data: {audio_data_v0.shape}\n')
# # Slicing with stride (stereo).
# new_data_v0 = audio_data_v0[:10856495//4, :]
# # Writing to a wav file.
# wavfile.write(
# filename=os.path.join(audio_examples_input_path, 'interstellar2.wav'),
# rate=sample_rate_v0,
# data=new_data_v0
# )
# # Loading the new audio data.
# filename = os.path.join(audio_examples_input_path, 'interstellar2.wav')
# sample_rate_v1, audio_data_v1 = wavfile.read(filename)
# print(f'Shape of the input audio data min: {audio_data_v1.shape}')
# print(f'Reduction (%): {int((len(audio_data_v0)-len(audio_data_v1))*100/len(audio_data_v0))}')
# IPython.display.Audio(audio_data_v1.T, rate=sample_rate_v1)
Diferencias entre formatos de archivo para almacenar audio digital.
Cargamos el archivo de audio .wav en este caso.
# Cargamos el archivo de audio.
filename = os.path.join(audio_input_path, 'sample1_stereo.wav')
# audio_data, sample_rate = librosa.load(filename, sr=None, mono=False)
sample_rate, audio_data = wavfile.read(filename)
print(f'Frecuencia de muestreo (sample rate): {sample_rate/1000} kHz')
Frecuencia de muestreo (sample rate): 44.1 kHz
Vamos a escucharlo. Para que esto se haga correctamente, hay que indicarle la frecuencia de muestreo (veremos más adelante qué es).
IPython.display.Audio(audio_data.T, rate=sample_rate) # .T se pasa únicamente si es audio estéreo.